package com.styletransfer.controller;

import com.styletransfer.model.ApiResponse;
import com.styletransfer.model.StyleTask;
import com.styletransfer.service.StyleTaskService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 风格转换任务控制器
 * 
 * 用于处理风格转换任务的创建和查询
 */
@RestController
@RequestMapping("/style-task")
public class StyleTaskController {
    
    private static final Logger logger = LoggerFactory.getLogger(StyleTaskController.class);
    
    @Autowired
    private StyleTaskService styleTaskService;
    
    /**
     * 创建风格转换任务
     * 
     * @param imageUrl 原图URL
     * @param styleIds 风格ID列表，以逗号分隔或数组
     * @param intensity 风格强度
     * @return 任务ID
     */
    @PostMapping("/create")
    public ApiResponse<Map<String, Object>> createTask(
            @RequestBody Map<String, Object> requestBody) {
        
        String imageUrl = (String) requestBody.get("imageUrl");
        Object styleIdsObj = requestBody.get("styleIds");
        Integer intensity = requestBody.get("intensity") != null ? 
                Integer.valueOf(requestBody.get("intensity").toString()) : 100;
        
        if (imageUrl == null || imageUrl.isEmpty()) {
            return ApiResponse.error("原图URL不能为空");
        }
        
        if (styleIdsObj == null) {
            return ApiResponse.error("风格ID不能为空");
        }
        
        logger.info("创建风格转换任务: imageUrl={}, styleIds={}, intensity={}", imageUrl, styleIdsObj, intensity);
        
        try {
            List<Long> styleIdList;
            
            // 处理styleIds，可能是字符串或数组
            if (styleIdsObj instanceof String) {
                // 如果是逗号分隔的字符串
                String styleIds = (String) styleIdsObj;
                styleIdList = Arrays.stream(styleIds.split(","))
                        .filter(s -> !s.isEmpty())
                        .map(Long::parseLong)
                        .collect(Collectors.toList());
            } else if (styleIdsObj instanceof List) {
                // 如果是数组
                List<?> styleIdObjList = (List<?>) styleIdsObj;
                styleIdList = styleIdObjList.stream()
                        .map(Object::toString)
                        .map(Long::parseLong)
                        .collect(Collectors.toList());
            } else {
                return ApiResponse.error("风格ID格式不正确");
            }
            
            if (styleIdList.isEmpty()) {
                return ApiResponse.error("至少需要选择一个风格");
            }
            
            // 调用服务创建任务
            return styleTaskService.createTask(imageUrl, styleIdList, intensity);
        } catch (Exception e) {
            logger.error("创建风格转换任务异常", e);
            return ApiResponse.error("创建任务失败: " + e.getMessage());
        }
    }
    
    /**
     * 查询任务状态
     * 
     * @param taskId 任务ID
     * @return 任务状态
     */
    @GetMapping("/status/{taskId}")
    public ApiResponse<Map<String, Object>> getTaskStatus(@PathVariable("taskId") String taskId) {
        logger.info("查询任务状态: taskId={}", taskId);
        
        try {
            // 调用服务查询任务状态
            return styleTaskService.getTaskStatus(taskId);
        } catch (Exception e) {
            logger.error("查询任务状态异常", e);
            return ApiResponse.error("查询任务状态失败: " + e.getMessage());
        }
    }
    
    /**
     * 查询用户的任务列表
     * 
     * @return 任务列表
     */
    @GetMapping("/my")
    public ApiResponse<List<StyleTask>> getUserTasks() {
        logger.info("查询用户任务列表");
        
        try {
            // 调用服务查询用户任务列表
            return styleTaskService.getUserTasks();
        } catch (Exception e) {
            logger.error("查询用户任务列表异常", e);
            return ApiResponse.error("查询任务列表失败: " + e.getMessage());
        }
    }
    
    /**
     * 查询用户的任务列表（支持分页和筛选）
     * 
     * @param page 页码
     * @param size 每页数量
     * @param status 任务状态
     * @return 任务列表
     */
    @GetMapping("/user")
    public ApiResponse<Map<String, Object>> getUserTasks(
            @RequestParam(value = "page", defaultValue = "1") Integer page,
            @RequestParam(value = "size", defaultValue = "10") Integer size,
            @RequestParam(value = "status", required = false) String status) {
        
        logger.info("查询用户任务列表: page={}, size={}, status={}", page, size, status);
        
        try {
            // 调用服务查询用户任务列表
            return styleTaskService.getUserTasksWithPagination(page, size, status);
        } catch (Exception e) {
            logger.error("查询用户任务列表异常", e);
            return ApiResponse.error("查询任务列表失败: " + e.getMessage());
        }
    }
    
    /**
     * 取消任务
     * 
     * @param taskId 任务ID
     * @return 操作结果
     */
    @PostMapping("/cancel/{taskId}")
    public ApiResponse<Void> cancelTask(@PathVariable("taskId") String taskId) {
        logger.info("取消任务: taskId={}", taskId);
        
        try {
            // 调用服务取消任务
            return styleTaskService.cancelTask(taskId);
        } catch (Exception e) {
            logger.error("取消任务异常", e);
            return ApiResponse.error("取消任务失败: " + e.getMessage());
        }
    }
    
    /**
     * 删除任务
     * 
     * @param taskId 任务ID
     * @return 操作结果
     */
    @DeleteMapping("/{taskId}")
    public ApiResponse<Void> deleteTask(@PathVariable("taskId") String taskId) {
        logger.info("删除任务: taskId={}", taskId);
        
        try {
            // 调用服务删除任务
            return styleTaskService.deleteTask(taskId);
        } catch (Exception e) {
            logger.error("删除任务异常", e);
            return ApiResponse.error("删除任务失败: " + e.getMessage());
        }
    }
    
    /**
     * 将任务保存为作品
     * 
     * @param taskId 任务ID
     * @param requestBody 作品数据
     * @return 操作结果
     */
    @PostMapping("/save-as-work/{taskId}")
    public ApiResponse<Void> saveTaskAsWork(
            @PathVariable("taskId") String taskId,
            @RequestBody Map<String, Object> requestBody) {
        
        logger.info("将任务保存为作品: taskId={}, data={}", taskId, requestBody);
        
        try {
            String title = (String) requestBody.get("title");
            String description = (String) requestBody.get("description");
            Boolean isPublic = (Boolean) requestBody.get("isPublic");
            
            if (title == null || title.isEmpty()) {
                return ApiResponse.error("作品标题不能为空");
            }
            
            // 调用服务将任务保存为作品
            return styleTaskService.saveTaskAsWork(taskId, title, description, isPublic);
        } catch (Exception e) {
            logger.error("将任务保存为作品异常", e);
            return ApiResponse.error("保存作品失败: " + e.getMessage());
        }
    }
}
